与FPGA的开发菜鸟交谈时，会发现从高层次上理解组成设备的组件常常会有帮助，而且时钟频率容易混淆。\par

\hspace*{\fill} \par %插入空行
\textbf{FPGA构建块}

为了帮助理解工具流(特别是编译时)，有必要提到组成FPGA的构建块。构建块是DPC++和SYCL的抽象，在程序开发中不起作用(至少在使代码具有某些功能方面)。然而，它们的存在确实会影响空间架构的优化和工具流的开发，例如：为应用程序选择数据类型时，有时也会影响高级优化。\par

简化的FPGA设备由五个基本元素组成\par

\begin{enumerate}
	\item 查询表:一些二进制输入线产生二进制输出的基本块。相对于输入，输出通过写到查询表中使用。这些都是原始块，但在用于计算的现代FPGA上有许多(数百万)块。这些是大部分设计实现的基础!
	\item 数学引擎:对于普通的数学操作，如单精度定位点数的加法或乘法，FPGA有专门的硬件使这些操作非常高效。FPGA有数千个这样的块——有些设备有8000多个——这样至少每个时钟周期都可以并行执行这些浮点基元操作!大多数FPGA将这些数学引擎命名为数字信号处理器(DSP)。
	\item 片上内存:这是FPGA与其他加速器的区别，而内存有两种类型(实际上更多):(1)用于在操作和其他目的之间传输的寄存器，(2)提供分布在设备上的随机访问内存的块内存。FPGA可以有大约数百万个寄存器位和超过10,000个20kbit的RAM存储器块。由于每一个都可以在时钟周期中激活，因此当有效使用片上内存容量和带宽时，效果显著。
	\item 外设接口:FPGA的扩展部分是由灵活的收发器和输入/输出连接，允许与所有的外存储器、网络接口等进行通信。
	\item 连接结构:前文本中提到的FPGA中的每个元素都有很多，并且连接不是固定的。一个复杂的可编连接允许信号在FPGA的结构中，进行细粒度传递。
\end{enumerate}

给定FPGA上每种特定类型的块的数量(有些块以百万计)和这些块的细粒度(如查询表)，生成FPGA配置位流时看到的编译时间可能更有意义。不仅需要为每个细粒度资源分配功能，还需要在它们之间配置连接。很多编译时间来自于在优化开始之前，找到FPGA结构的第一个合法映射!\par

\hspace*{\fill} \par %插入空行
\textbf{时钟频率}

因为它是非常灵活和可配置的，与CPU或任何其他固定计算架构的同等设计相比，FPGA运行的频率的可配置性会带来了一些开销，但这不是问题!FPGA的空间架构大大弥补了时钟频率，因为有如此多的独立操作同时发生，分布在FPGA的区域。简单地说，由于可配置的设计，FPGA的频率比其他架构低，但每个时钟周期发生更多的事件，从而平衡了频率。在对基准和加速器进行比较时，应该比较计算吞吐量(例如每秒的操作数)，而不是原始频率。\par

当FPGA上的资源利用率接近100\%时，工作频率可能会下降，主要是设备上的信号连接资源过度使用的结果。有一些方法可以弥补这一点，通常是增加编译时间。但是对于大多数应用程序，最好避免在FPGA上使用超过80-90\%的资源，除非愿意深入研究，避免频率下降。\par

\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black]
经验法则:尽量不要超过FPGA上任何资源的90\%，当然也不要超过多个资源的90\%。超过可能导致连接资源耗尽，从而降低工作频率。
\end{tcolorbox}










